useMemo 與 React.memo 一樣,
作用是優化效能,
適合用在複雜緩慢且變動性不大,
其結果不需要經常 re-render 的計算上。
const memorizedValue = useMemo(callback, array)
useMemo 內執行的 function 會於 render 期間執行,而 useEffect 的內容是在 render 後執行,因此 useMemo 內不能使用 useEffect。
function slowFunction(num) {
console.log('Calling Slow Function');
for(let i=0; i<=1000000; i++) {}
return num*2;
}
const App = () => {
const [number, setNumber] = useState(0);
const [dark, setDark] = useState(true);
const doubleNumber = useMemo(() => slowFunction(number), [number]);
const themeStyle = useMemo(() => {
return {
backgroundColor: dark ? '#2c3e50': '#ecf0f1',
color: dark ? '#ecf0f1' : '#2c3e50'
}
}, [dark])
useEffect(() => {
console.log('Theme Change')
}, [themeStyle])
const changeHandler = e => {
setNumber(e.target.value)
}
const changeTheme = () => {
setDark(prevDark => !prevDark)
}
return (
<>
<input type='number' value={number} onChange={changeHandler} />
<button onClick={changeTheme}>Change Theme</button>
</>
)
};